#ifndef __LINKEDLIST_H__
#define __LINKEDLIST_H__

typedef struct listnode {
    int val;
    struct listnode* next;
} listnode;

typedef struct linkedlist {
    int length;
    struct listnode* head;
} linkedlist;

/**
 * 创建一个新的带头节点的单链表
 * @return 新创建的顺序表的指针
 */
extern linkedlist* create_list();

/**
 * 销毁顺序表
 * @param list 待销毁的顺序表
 */
extern void free_list(linkedlist* list);

/**
 * 遍历顺序表
 * @param list 要遍历的顺序表
 * @param callback 回调函数
 */
extern void visit_list(linkedlist* list, void (*callback)(int));

/**
 * 向顺序表中指定位置插入元素
 * @param list 待插入的列表
 * @param p 待插入元素的位置（在指针p指向的元素的后面插入一个新元素）
 * @param val 新元素的值
 */
extern void insert(linkedlist* list, int* p, int val);

/**
 * 删除顺序表中指定位置的元素
 * @param list 待删除元素的列表
 * @param p 待删除元素的位置
 */
extern void remove(linkedlist* list, int* p);

/**
 * 在顺序表中查找指定的元素，如果找到，则返回该元素的指针，否则返回空指针
 * @param list 顺序表
 * @param val 待查找的元素
 */
extern int* find(linkedlist* list, int val);

#endif